home *** CD-ROM | disk | FTP | other *** search
/ Chip: Special Tips & Tricks for Windows 95 / Chip Wintips.iso / sterown / grafika / w2p_pd12 / pd12.ms_ / pd12.ms
Text File  |  1996-04-02  |  26KB  |  792 lines

  1. '**************************************************************************
  2. '* combined setup script for POWERdraft for AutoCAD and POWERdraft for LT
  3. '*   original template: MSSetup Toolkit Sample 1
  4. '*   includes installation of Win32s subset
  5. '**************************************************************************
  6. '*
  7. '* REV:
  8. '* ??.11.94, mk: merged scripts for R12/Win and LT/Win
  9. '* 25.11.94, mk: added MULTIman as a valid Windows driver name
  10. '* 13.01.95, mk: changed destination for DRWLIB files from DESTSYS to DESTWIN,
  11. '                added fix for a bug we only saw in R13 but was reported for
  12. '                PD12 by a customer
  13. '* 19.01.95, mk: added the naming scheme for the new Windows drivers
  14. '* 13.03.95, mk: installation of PD12 _and_ PD13 on one machine didn't work
  15. '* 02.04.96, mb: win32s should be installed separately
  16.  
  17. '$DEFINE DEBUG  ''Define for script development/debugging
  18.  
  19. '$INCLUDE 'setupapi.inc'
  20. '$INCLUDE 'msdetect.inc'
  21.  
  22. ''Dialog ID's, all LT specific dialogs are offset by 20
  23. CONST LANGUAGE      =  50
  24. CONST WELCOME       = 100
  25. CONST ASKQUIT       = 200
  26. CONST ACADPATH      = 300
  27. CONST DESTPATH      = 350
  28. CONST DEST_LT       = 370
  29. CONST EXITFAILURE   = 400
  30. CONST EXITQUIT      = 600
  31. 'CONST EXITOK        = 700
  32. 'CONST EXITOK_LT     = 720
  33. CONST EXITOK_NOW32  = 750
  34. CONST EXITOK_NW32LT = 770
  35. CONST DRVHELP       = 900
  36.  
  37. 'CONST W32SHELP          = 1000
  38. CONST W32SMISSING       = 1100
  39. CONST W32STOOOLD        = 1150
  40. CONST W32SCONFIRM       = 1170
  41. CONST EXITFAILNOTWIN31  = 1200
  42. CONST EXITFAILNOTENH    = 1300
  43. 'CONST EXITFAILNOTPAGING = 1400
  44. CONST EXITFAILOLDDRV    = 1500
  45. CONST WILLBREAKOLD      = 1600
  46. CONST WILLBREAKNEW      = 1650
  47.  
  48. CONST BADPATH       = 6400
  49.  
  50. ''Bitmap ID
  51. CONST LOGO = 1
  52.  
  53. CONST DRIVERFAMILY  = "POWERdraft for AutoCAD"
  54. CONST DRIVERKEY_12  = "WinADIR12"
  55. CONST DRIVERKEY_LT  = "WinADILT"
  56. CONST DRIVERNAME_12 = "POWERdraft for AutoCAD R12"
  57. CONST DRIVERNAME_LT = "POWERdraft for AutoCAD LT"
  58. ''!! FIXME
  59. CONST MINDRVVER31   = "5.20"    '' remember to update dialog EXITFAILOLDDRV!
  60. CONST MINWIN32SVER  = "1.25.142.0" '' in system\win32s.ini [Win32s] Version
  61.  
  62. GLOBAL CUIDLL$      ''name of custom user interface DLL
  63. GLOBAL DEST$        ''Default destination directory.
  64. GLOBAL DESTACAD$    ''ACAD's home directory.
  65. GLOBAL DESTWIN$     ''Windows directory.
  66. GLOBAL DESTSYS$     ''Windows\System directory.
  67. GLOBAL DEST32S$     ''Windows\System\Win32s directory
  68. GLOBAL LANG%        ''language code, is added to every dialog ID
  69. GLOBAL ACADLT%      ''flag for AutoCAD LT installation
  70. GLOBAL AlwaysCopy%  ''special flag to uncoditionally overwrite Win32S
  71. GLOBAL ExitCode%    ''global error code
  72.  
  73. DECLARE SUB Install
  74. DECLARE SUB UpdateELSADisp
  75. DECLARE FUNCTION NeedELSADisp AS INTEGER
  76. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  77. DECLARE FUNCTION ExitWindowsExec LIB "USER.EXE" (arg1$, arg2$) AS INTEGER
  78.  
  79. DECLARE FUNCTION GlobalFindAtom LIB "USER" (arg1$) AS INTEGER
  80.  
  81.  
  82. INIT:
  83.     CUIDLL$ = "mscuistf.dll"            ''Custom user interface dll
  84.     HELPPROC$ = "FHelpDlgProc"          ''Help dialog procedure
  85.     CheckWin32s% = 0
  86.     Win32sIsOld% = 0
  87.     AlwaysCopy% = 0
  88.     ExitCode% = EXITFAILURE
  89.     ON ERROR GOTO ERRNORMAL
  90.  
  91.     '' build a global list of ELSA system components used by this driver
  92.     AddListItem "USES", "DRWh"
  93.     AddListItem "USES", "DL32h"
  94.  
  95.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  96.  
  97.     SetBitmap CUIDLL$, LOGO
  98.     SetTitle DRIVERFAMILY
  99.  
  100.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  101.     IF szInf$ = "" THEN
  102.         szInf$ = GetSymbolValue("STF_CWDDIR") + "PD12.INF"
  103.     END IF
  104.     ReadInfFile szInf$
  105.  
  106.     LANG% = 0
  107.     DEST$ = "C:\WINNER\WINADI\"
  108.     DESTWIN$ = GetWindowsDir()
  109.     DESTSYS$ = GetWindowsSysDir()
  110.     DEST32S$ = DESTSYS$ + "WIN32S\"
  111.  
  112. '$IFDEF DEBUG
  113.     i% = SetSizeCheckMode(scmOnIgnore)    '' could use scmOff; def = scmOnFatal
  114.     WinDrive$ = MID$(GetWindowsDir, 1, 1)
  115.     IF IsDriveValid(WinDrive$) = 0 THEN
  116.         i% = DoMsgBox("Windows drive ('"+WinDrive$+"') is not a valid drive.", "DEBUG", MB_TASKMODAL+MB_ICONHAND+MB_OK)
  117.         GOTO QUIT
  118.     END IF
  119. '$ENDIF ''DEBUG
  120.  
  121.  
  122. LANGUAGE:
  123.     langstr$ = STR$(LANG% + 1)
  124.     SetSymbolValue "RadioDefault", langstr$
  125. LANGL1:
  126.     sz$ = UIStartDlg(CUIDLL$, LANGUAGE, "FRadioDlgProc", 0, "")
  127.     langstr$ = GetSymbolValue("ButtonChecked")
  128.     LANG% = VAL(LANGSTR$) - 1
  129.  
  130.     IF sz$ = "CONTINUE" THEN
  131.         UIPop(1)
  132.     ELSEIF sz$ = "REACTIVATE" THEN
  133.         GOTO LANGL1
  134.     ELSE
  135.         GOSUB ASKQUIT
  136.         GOTO LANGUAGE
  137.     END IF
  138.  
  139.  
  140. WELCOME:
  141.     sz$ = UIStartDlg(CUIDLL$, WELCOME+LANG%, "FInfoDlgProc", DRVHELP+LANG%, HELPPROC$)
  142.     IF sz$ = "CONTINUE" THEN
  143.         UIPop 1
  144.     ELSEIF sz$ = "REACTIVATE" THEN
  145.         GOTO WELCOME
  146.     ELSEIF sz$ = "BACK" THEN
  147.         UIPop 1
  148.         GOTO LANGUAGE
  149.     ELSE
  150.         GOSUB ASKQUIT
  151.         GOTO WELCOME
  152.     END IF
  153.  
  154. CHECK:
  155.     IF GetWindowsMajorVersion <> 3 THEN
  156.         ExitCode% = EXITFAILNOTWIN31
  157.         GOTO QUIT
  158.     END IF
  159.     IF GetWindowsMinorVersion < 10 THEN
  160.         ExitCode% = EXITFAILNOTWIN31
  161.         GOTO QUIT
  162.     END IF
  163.     IF GetWindowsMinorVersion >= 50 AND GetWindowsMinorVersion < 95 THEN
  164.         ExitCode% = EXITFAILNOTWIN31
  165.         GOTO QUIT
  166.     END IF
  167.     IF GetWindowsMode < 2  THEN
  168.         ExitCode% = EXITFAILNOTENH      '' Standard Mode Windows
  169.         GOTO QUIT
  170.     END IF
  171.     '' check for ELSA display driver running
  172.     IF GlobalFindAtom( "ELSA_Driver" ) = 0 THEN
  173.         ExitCode% = EXITFAILOLDDRV
  174.         GOTO QUIT
  175.     END IF
  176.     '' windows 95 is o.k. - no need to check the display driver version
  177.     IF GetWindowsMinorVersion <> 95 THEN
  178.         '' win3.1x
  179.         '' get version number of Windows display driver -
  180.         '' since it's difficult to check whether multiman is running or not,
  181.         '' we only check the driver's version.
  182.         '' multiman version is checked at runtime of PD12
  183.         ini$ = MakePath( GetWindowsDir(), "SYSTEM.INI" )
  184.         DrvVersion$ = LTRIM$(RTRIM$(GetIniKeyString( ini$, "ELSA", "Version" )))
  185.         ''dummy% = DoMsgBox(":"+DrvVersion$+":"+MINDRVVER31+":", "DEBUG", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  186.         IF DrvVersion$ < MINDRVVER31 THEN
  187.             ExitCode% = EXITFAILOLDDRV
  188.             GOTO QUIT
  189.         END IF
  190.         '' Win32s needed for Win3.1x
  191.         CheckWin32s% = 1
  192.     END IF
  193. CHECKDONE:
  194.  
  195.  
  196. CHECKWIN32S:
  197.     IF CheckWin32s% = 1 THEN
  198.  
  199.         '' Check if Win32s is partially installed
  200.         sz$ = GetIniKeyString (DESTSYS$ + "WIN32S.INI", "Win32s", "Setup")
  201.         '' If WIN32S.INI is missing or specifies Setup!=0, then install
  202.         IF sz$ <> "1" THEN
  203.             '' no Win32s
  204.             SetSymbolValue "EditTextIn", "abc"
  205.             SetSymbolValue "EditFocus", "END"
  206.             sz$ = UIStartDlg(CUIDLL$, W32SMISSING+LANG%, "FEditDlgProc", DRVHELP+LANG%, HELPPROC$)
  207.             ERROR STFQUIT
  208.         END IF
  209.         '' If Win32s is already installed, get running version number
  210.         szOldVer$ = GetIniKeyString(DESTSYS$ + "WIN32S.INI", "Win32s", "Version")
  211.         IF szOldVer$ < MINWIN32SVER THEN
  212.             '' Win32s is too old
  213.             Win32sIsOld% = 1
  214. WIN32SOLD:
  215.             SetSymbolValue "EditTextIn", szOldVer$
  216.             SetSymbolValue "EditFocus", "END"
  217. WIN32SOLDL1:
  218.             sz$ = UIStartDlg(CUIDLL$, W32STOOOLD+LANG%, "FEditDlgProc", DRVHELP+LANG%, HELPPROC$)
  219.             IF sz$ = "CONTINUE" THEN
  220.                 UIPop 1
  221. WIN32SOLDL2:
  222.                 sz$ = UIStartDlg(CUIDLL$, W32SCONFIRM+LANG%, "FInfoDlgProc", DRVHELP+LANG%, HELPPROC$)
  223.                 IF sz$ = "CONTINUE" THEN
  224.                     UIPop 1
  225.                     GOTO WIN32SDONE
  226.                 ELSEIF sz$ = "REACTIVATE" THEN
  227.                     GOTO WIN32SOLDL2
  228.                 ELSEIF sz$ = "BACK" THEN
  229.                     UIPop 1
  230.                     GOTO WIN32SOLDL1
  231.                 ELSE
  232.                     UIPop 1
  233.                     ERROR STFQUIT
  234.                 END IF
  235.             ELSEIF sz$ = "REACTIVATE" THEN
  236.                 GOTO WIN32SOLDL1
  237.             ELSEIF sz$ = "BACK" THEN
  238.                 UIPop 1
  239.                 GOTO WELCOME
  240.             ELSE
  241.                 UIPop 1
  242.                 ERROR STFQUIT
  243.             END IF
  244.         END IF
  245.  
  246.     END IF
  247.  
  248. WIN32SDONE:
  249.  
  250.  
  251.     '' try to find AutoCAD, if it fails keep string empty
  252.     '' typical entry in WIN.INI is:
  253.     ''   [Extensions]
  254.     ''   dwg=D:\ACAD\R12C1WUS\acad.exe ^.dwg
  255.     '' or
  256.     ''   dwg=D:\ACAD\LTWIN\aclt.exe ^.dwg
  257.     DESTACAD$ = UCASE$( GetIniKeyString( "WIN.INI", "Extensions", "dwg" ) )
  258.     IF INSTR( DESTACAD$, "\ACAD.EXE" ) <> 0 THEN
  259.         DESTACAD$ = MID$( DESTACAD$, 1,  INSTR( DESTACAD$, "\ACAD.EXE" ) )
  260.     ELSEIF INSTR( DESTACAD$, "\ACLT.EXE" ) <> 0  THEN
  261.         DESTACAD$ = MID$( DESTACAD$, 1,  INSTR( DESTACAD$, "\ACLT.EXE" ) )
  262.     END IF
  263.  
  264. GETACAD:
  265.     SetSymbolValue "EditTextIn", DESTACAD$
  266.     SetSymbolValue "EditFocus", "END"
  267. GETACADL1:
  268.     sz$ = UIStartDlg(CUIDLL$, ACADPATH+LANG%, "FEditDlgProc", DRVHELP+LANG%, HELPPROC$)
  269.     DESTACAD$ = LTRIM$(RTRIM$(UCASE$( GetSymbolValue("EditTextOut") )))
  270.     IF DESTACAD$ = "" THEN
  271.         GOSUB BADPATH
  272.         GOTO GETACADL1
  273.     END IF
  274.     IF MID$(DESTACAD$, LEN(DESTACAD$), 1) <> "\" THEN
  275.         DESTACAD$ = DESTACAD$ + "\"
  276.     END IF
  277.  
  278.     IF sz$ = "CONTINUE" THEN
  279.         IF DoesDirExist(DESTACAD$) = 0 THEN
  280.             GOSUB BADPATH
  281.             GOTO GETACADL1
  282.         END IF
  283.         IF DoesFileExist( DESTACAD$ + "ACAD.EXE", femExist ) THEN
  284.             ACADLT% = 0
  285.             '' R13 has no ACAD.DLL
  286.             IF DoesFileExist( DESTACAD$ + "ACAD.DLL", femExist ) = 0 THEN
  287.                 GOSUB BADPATH
  288.                 GOTO GETACADL1
  289.             END IF
  290.         ELSEIF DoesFileExist( DESTACAD$ + "ACLT.EXE", femExist ) THEN
  291.             ACADLT% = 1
  292.             IF IsDirWritable(DESTACAD$) = 0 THEN
  293.                 GOSUB BADPATH
  294.                 GOTO GETACADL1
  295.             END IF
  296.         ELSE
  297.             GOSUB BADPATH
  298.             GOTO GETACADL1
  299.         END IF
  300.         UIPop 1
  301.     ELSEIF sz$ = "REACTIVATE" THEN
  302.         GOTO GETACADL1
  303.     ELSEIF sz$ = "BACK" THEN
  304.         UIPop 1
  305.         IF Win32sIsOld% = 1 THEN
  306.             GOTO WIN32SOLD
  307.         ELSE
  308.             GOTO WELCOME
  309.         END IF
  310.     ELSE
  311.         GOSUB ASKQUIT
  312.         GOTO GETACAD
  313.     END IF
  314.  
  315.  
  316. GETPATH:
  317.     IF ACADLT% = 1 THEN
  318.         DEST$ = DESTACAD$
  319.         sz$ = UIStartDlg(CUIDLL$, DEST_LT+LANG%, "FEditDlgProc", DRVHELP+LANG%, HELPPROC$)
  320.     ELSE
  321.         SetSymbolValue "EditTextIn", DEST$
  322.         SetSymbolValue "EditFocus", "END"
  323. GETPATHL1:
  324.         sz$ = UIStartDlg(CUIDLL$, DESTPATH+LANG%, "FEditDlgProc", DRVHELP+LANG%, HELPPROC$)
  325.         DEST$ = LTRIM$(RTRIM$(UCASE$( GetSymbolValue("EditTextOut") )))
  326.         IF DEST$ = "" THEN
  327.             GOSUB BADPATH
  328.             GOTO GETPATHL1
  329.         END IF
  330.         IF MID$(DEST$, LEN(DEST$), 1) <> "\" THEN
  331.             DEST$ = DEST$ + "\"
  332.         END IF
  333.     END IF
  334.  
  335.     IF sz$ = "CONTINUE" THEN
  336.         IF IsDirWritable(DEST$) = 0 THEN
  337.             GOSUB BADPATH
  338.             GOTO GETPATHL1
  339.         END IF
  340.         UIPop 1
  341.     ELSEIF sz$ = "REACTIVATE" THEN
  342.         GOTO GETPATHL1
  343.     ELSEIF sz$ = "BACK" THEN
  344.         UIPop 1
  345.         GOTO GETACAD
  346.     ELSE
  347.         GOSUB ASKQUIT
  348.         GOTO GETPATH
  349.     END IF
  350.  
  351. CHECKDISP:
  352.     IF NeedELSADisp() = -1 THEN
  353.         ExitCode% = EXITQUIT
  354.         GOTO QUIT
  355.     END IF
  356.  
  357.  
  358. DOINSTALL:
  359.     Install
  360.  
  361.  
  362. QUIT:
  363.     ON ERROR GOTO ERRQUIT
  364.  
  365.     IF ERR = 0 THEN
  366.         dlg% = ExitCode%
  367.     ELSEIF ERR = STFQUIT THEN
  368.         dlg% = EXITQUIT
  369.         ExitCode% = EXITQUIT
  370.     ELSE
  371.         i% = DoMsgBox("Internal error: "+ERROR$ +" ("+STR$(i%-8)+") in line "+STR$(ERL), "Runtime error", MB_OK+MB_TASKMODAL+MB_ICONINFORMATION)
  372.         dlg% = EXITFAILURE
  373.         ExitCode% = EXITQUIT
  374.     END IF
  375. QUITL1:
  376.     sz$ = UIStartDlg(CUIDLL$, dlg%+LANG%, "FInfo0DlgProc", 0, "")
  377.     IF sz$ = "REACTIVATE" THEN
  378.         GOTO QUITL1
  379.     END IF
  380.     UIPop 1
  381.  
  382.     END
  383.  
  384.  
  385. '*****************************************************************************
  386.  
  387.  
  388. ERRQUIT:
  389.     i% = DoMsgBox("Setup sources were corrupted, call your dealer!", "Setup Message", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  390.     END
  391.  
  392.  
  393. '' Bypass run-time errors. Let final dialog box display fatal error message.
  394. ERRNORMAL:
  395.     '' Check if user cancelled setup
  396.     IF ERR = STFQUIT THEN
  397.         GOTO QUIT
  398.     END IF
  399.     RESUME NEXT
  400.  
  401.  
  402. BADPATH:
  403.     sz$ = UIStartDlg(CUIDLL$, BADPATH+LANG%, "FInfo0DlgProc", 0, "")
  404.     IF sz$ = "REACTIVATE" THEN
  405.         GOTO BADPATH
  406.     END IF
  407.     UIPop 1
  408.     RETURN
  409.  
  410.  
  411. ASKQUIT:
  412.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT+LANG%, "FQuitDlgProc", 0, "")
  413.  
  414.     IF sz$ = "EXIT" THEN
  415.         UIPopAll
  416.         ERROR STFQUIT
  417.     ELSEIF sz$ = "REACTIVATE" THEN
  418.         GOTO ASKQUIT
  419.     ELSE
  420.         UIPop 1
  421.     END IF
  422.     RETURN
  423.  
  424.  
  425.  
  426. '**
  427. '** Purpose:
  428. '**     Builds the copy list and performs all installation operations.
  429. '** Arguments:
  430. '**     none.
  431. '** Returns:
  432. '**     none.
  433. '*************************************************************************
  434. SUB Install STATIC
  435.  
  436.     ExitCode% = EXITFAILURE
  437.  
  438.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  439.  
  440.     '' let's start with POWERdraft files
  441.     CreateDir DEST$, cmoNone
  442.  
  443.     OpenLogFile DEST$ + "PD12.LOG", 0
  444.     WriteToLogFile ""
  445.     WriteToLogFile "  Source directory:      '" + SrcDir$ + "'"
  446.     WriteToLogFile "  Destination directory: '" + DEST$ + "'"
  447.     WriteToLogFile "  AutoCAD directory:     '" + DESTACAD$ + "'"
  448.     WriteToLogFile "  Windows directory:     '" + DESTWIN$ + "'"
  449.     WriteToLogFile "  Windows sys directory: '" + DESTSYS$ + "'"
  450.     WriteToLogFile ""
  451.  
  452.     '' Gimme a second, need to clean up a problem of early SETUPs
  453.     IF IsWindowsNT% = 0 THEN
  454.         WriteToLogFile "'' fix wrong installation of early SETUP versions"
  455.         FOR i%=1 TO GetListLength("USES") STEP 1
  456.             Component$ = GetListItem( "USES", i% )
  457.             MakeListFromSectionFilename "MOVEFILES", Component$
  458.             FOR j%=1 TO GetListLength("MOVEFILES") STEP 1
  459.                 szFile$ = GetListItem( "MOVEFILES", j% )
  460.                 IF DoesFileExist(DESTSYS$ + szFile$,femExist) THEN
  461.                     CopyFile DESTSYS$ + szFile$, DESTWIN$ + szFile$, cmoNone,0
  462.                     RemoveFile DESTSYS$ + szFile$, cmoNone
  463.                 END IF
  464.             NEXT j%
  465.             RemoveSymbol "MOVEFILES"
  466.         NEXT i%
  467.     END IF
  468.  
  469.     AddSectionFilesToCopyList DRIVERKEY_12, SrcDir$, DEST$
  470.  
  471.     FOR i%=1 TO GetListLength("USES") STEP 1
  472.         Component$ = GetListItem( "USES", i% )
  473.         AddSectionFilesToCopyList Component$, SrcDir$, DESTWIN$
  474.     NEXT i%
  475.  
  476. ''!! debugging aid: DumpCopyList DEST$ + "PD12.LST"
  477.     CopyFilesInCopyList
  478.     IF ERR <> 0 THEN
  479.         EXIT SUB
  480.     END IF
  481.  
  482.     IF ACADLT% = 1 THEN
  483.         '' keep AutoCAD's driver by renaming, put our's in place
  484.         IF DoesFileExist(DEST$ + "acltds_o.dll",femExists) = 0 THEN
  485.             RenameFile DEST$ + "acltds.dll", "acltds_o.dll"
  486.         ELSE
  487.             RemoveFile DEST$ + "acltds.dll", cmoNone
  488.         END IF
  489.         RenameFile DEST$ + "dselsa.dll", "acltds.dll"
  490.     END IF
  491.  
  492.     '' if copy succeeded, do all INI changes, first for POWERdraft ...
  493.     ini$ = DESTWIN$ + "DSELSA.INI"
  494.     CreateIniKeyValue ini$, "Options", "Autostart", "Cockpit^s", cmoNone
  495.  
  496.     '' maintain our ELSADISP.INI
  497.     UpdateELSADisp
  498.  
  499.     IF DESTACAD$ <> "" THEN
  500.         IF ACADLT% = 1 THEN
  501.             ini$ = MakePath(DESTACAD$, "ACLT.INI")
  502.             acadsect$ = "AutoCAD LT General"
  503.         ELSE
  504.             ini$ = MakePath(DESTACAD$, "ACAD.INI")
  505.             acadsect$ = "AutoCAD General"
  506.         END IF
  507.  
  508.         IF ACADLT% = 0 THEN
  509.             '' append destination path to AutoCAD's key ACADDRV in ACAD.INI
  510.             acaddrv$ = UCASE$( GetIniKeyString( ini$, acadsect$, "ACADDRV" ) )
  511.             IF INSTR( acaddrv$, DEST$ ) = 0 THEN
  512.                 acaddrv$ = acaddrv$ + ";" + DEST$
  513.             END IF
  514.             CreateIniKeyValue ini$, acadsect$, "ACADDRV", acaddrv$, cmoOverwrite
  515.         END IF
  516.  
  517.         IF GetIniKeyString( ini$, acadsect$, "ToolBar1" ) = "" THEN
  518.  
  519.             ' they have a built in default of 17 buttons
  520.             CreateIniKeyValue ini$, acadsect$, "ToolBar18", "'Cockpit #C", cmoOverwrite
  521.             CreateIniKeyValue ini$, acadsect$, "ToolBar19", "'MagniView #M", cmoOverwrite
  522.  
  523.         ELSE
  524.  
  525.             ' user already changed buttons that made ACAD write list to ini file
  526.             FOR i%=1 TO 26 STEP 1
  527.                 tb_key$ = "ToolBar" + LTRIM$(RTRIM$( STR$(i) ))
  528.                 tb_val$ = UCASE$( GetIniKeyString( ini$, acadsect$, tb_key$ ) )
  529.                 IF INSTR( tb_val$, "COCKPIT" ) THEN
  530.                     EXIT FOR
  531.                 END IF
  532.                 IF tb_val$ = "" THEN
  533.                     CreateIniKeyValue ini$, acadsect$, tb_key$, "'Cockpit #C", cmoOverwrite
  534.                     EXIT FOR
  535.                 END IF
  536.             NEXT i%
  537.             FOR i%=1 TO 26 STEP 1
  538.                 tb_key$ = "ToolBar" + LTRIM$(RTRIM$( STR$(i) ))
  539.                 tb_val$ = UCASE$( GetIniKeyString( ini$, acadsect$, tb_key$ ) )
  540.                 IF INSTR( tb_val$, "MAGNIVIEW" ) THEN
  541.                     EXIT FOR
  542.                 END IF
  543.                 IF tb_val$ = "" THEN
  544.                     CreateIniKeyValue ini$, acadsect$, tb_key$, "'MagniView #M", cmoOverwrite
  545.                     EXIT FOR
  546.                 END IF
  547.             NEXT i%
  548.  
  549.         END IF
  550.  
  551.     END IF
  552.  
  553.     '' put a help file icon into AutoCAD group in ProgMangler
  554.     IF LANG%=1 THEN
  555.         helpfile$ = DEST$ + "lang_de.hlp"
  556.     ELSE
  557.         helpfile$ = DEST$ + "lang_en.hlp"
  558.     END IF
  559.     IF ACADLT% = 1 THEN
  560.         CreateProgmanItem "AutoCAD LT", DRIVERNAME_LT, helpfile$, "", cmoOverwrite
  561.     ELSE
  562.         CreateProgmanItem "AutoCAD", DRIVERNAME_12, helpfile$, "", cmoOverwrite
  563.     END IF
  564.  
  565.     IF ACADLT% = 1 THEN
  566.         ExitCode% = EXITOK_NW32LT
  567.     ELSE
  568.         ExitCode% = EXITOK_NOW32
  569.     END IF
  570.  
  571.     CloseLogFile
  572.  
  573. END SUB
  574.  
  575.  
  576. '**
  577. '** Purpose:
  578. '**     Check versions of our system components and handle compatibility
  579. '**     conflicts
  580. '** Arguments:
  581. '**     -
  582. '** Returns:
  583. '**     0 for no install needed, 1 for install required, -1 for abort
  584. '*************************************************************************
  585. FUNCTION NeedELSADisp STATIC AS INTEGER
  586.  
  587.     ReturnValue% = 1
  588.  
  589.     IF ACADLT=1 THEN
  590.         DriverName$ = DRIVERNAME_LT
  591.     ELSE
  592.         DriverName$ = DRIVERNAME_12
  593.     END IF
  594.  
  595.     '' we have version numbers of all components in our INI file ELSADISP.INI
  596.     '' use this to check for incompatible updates
  597.     ELSAdisp$ = DESTWIN$ + "ELSADISP.INI"
  598.     IF DoesFileExist(ELSAdisp$,femExist) THEN
  599.         IF DoesFileExist(ELSAdisp$,femReadWrite) = 0 THEN
  600.             i% = DoMsgBox( "ABORT: " + ELSAdisp$ + " is write protected!", "Fatal Error", MB_ICONSTOP+MB_TASKMODAL)
  601.             NeedELSADisp = -1
  602.             EXIT FUNCTION
  603.         END If
  604.     END IF
  605.  
  606.     '' Check versions of system components,
  607.     '' use the file marked "VERCHECK" in each group
  608.     FOR i%=1 TO GetListLength("USES") STEP 1
  609.  
  610.         Component$ = GetListItem( "USES", i% )
  611.         usedby$ = GetIniKeyString( ELSAdisp$, Component$, "UsedBy" )
  612.  
  613.         '' get compatibility levels
  614.         szNewVer$ = GetSectionKeyVersion(Component$,"VERCHECK")
  615.         szOldVer$ = GetVersionOfFile( DESTWIN$ + GetSectionKeyFileName(Component$,"VERCHECK") )
  616.         '' Once upon a time we had a broken SETUP ...
  617.         '' that installed to DESTSYS instead of DESTWIN, so look there too,
  618.         '' we will move the files in subroutine Install
  619.         IF szOldVer$ = "" THEN
  620.             szOldVer$ = GetVersionOfFile( DESTSYS$ + GetSectionKeyFileName(Component$,"VERCHECK") )
  621.         END IF
  622.         '' can not be incompatible if it is not installed ...
  623.         IF szOldVer$ <> "" THEN
  624.             szNewLev& = GetVersionNthField( szNewVer$, 1 )
  625.             szOldLev& = GetVersionNthField( szOldVer$, 1 )
  626.             '' remember incompatible components in a list
  627.             IF szNewLev& <> szOldLev& THEN
  628.                 AddListItem "COMPLEVEL", Component$
  629.                 ReturnValue% = 2
  630.             ENDIF
  631.  
  632.             '' build list of broken apps
  633.             FOR j% = 1 TO 999 STEP 1
  634.                 app$ = GetNthFieldFromIniString( usedby$, j% )
  635.                 IF app$ = "" THEN
  636.                     EXIT FOR
  637.                 END IF
  638.                 AppName$ = GetIniKeyString( ELSAdisp$, app$, "FullName" )
  639.                 IF szNewLev& > szOldLev& THEN
  640.                     ''add every app only once ...
  641.                     IF INSTR(OldApps$,AppName$) = 0 THEN
  642.                         ''... and never ourselves
  643.                         IF AppName$<>DriverName$ THEN
  644.                             OldApps$ = OldApps$ + AppName$ + ";"
  645.                         END IF
  646.                     END IF
  647.                 ELSEIF szNewLev& < szOldLev& THEN
  648.                     '' oh shit, we are really old!
  649.                     IF INSTR( NewApps$, AppName$ ) = 0 THEN
  650.                         IF AppName$<>DriverName$ THEN
  651.                             NewApps$ = NewApps$ + AppName$ + ";"
  652.                         END IF
  653.                     END IF
  654.                 END IF
  655.             NEXT j%
  656.         END IF
  657.  
  658.     NEXT i%
  659.  
  660.     IF OldApps$ <> "" THEN
  661. BROKENOLD:
  662.         ''convert our string delimited with ";" into a Symbol table list
  663.         RemoveSymbol "ListItemsIn"
  664.         WHILE OldApps$ <> ""
  665.             i% = INSTR( OldApps$, ";" )
  666.             AppName$ = MID$( OldApps$, 1, i%-1 )
  667.             AddListItem "ListItemsIn", AppName$
  668.             OldApps$ = MID$( OldApps$, i%+1 )
  669.         WEND
  670.         sz$ = UIStartDlg(CUIDLL$, WILLBREAKOLD+LANG%, "FListDlgProc", 0, "")
  671.         IF sz$ = "CONTINUE" THEN
  672.             UIPop 1
  673.         ELSEIF sz$ = "REACTIVATE" THEN
  674.             GOTO BROKENOLD
  675.         ELSE
  676.             UIPop 1
  677.             ReturnValue% = -1
  678.         END IF
  679.     END IF
  680.     IF NewApps$ <> "" THEN
  681. BROKENNEW:
  682.         RemoveSymbol "ListItemsIn"
  683.         WHILE NewApps$ <> ""
  684.             i% = INSTR( NewApps$, ";" )
  685.             AppName$ = MID$( NewApps$, 1, i%-1 )
  686.             AddListItem "ListItemsIn", AppName$
  687.             NewApps$ = MID$( NewApps$, i%+1 )
  688.         WEND
  689.         sz$ = UIStartDlg(CUIDLL$, WILLBREAKNEW+LANG%, "FListDlgProc", 0, "")
  690.         IF sz$ = "CONTINUE" THEN
  691.             UIPop 1
  692.         ELSEIF sz$ = "REACTIVATE" THEN
  693.             GOTO BROKENNEW
  694.         ELSE
  695.             UIPop 1
  696.             ReturnValue% = -1
  697.         END IF
  698.     END IF
  699.  
  700.     '' If user decided to continue installation (breaking another app)
  701.     '' delete the old system files to make sure they will be copied.
  702.     '' Otherwise the filedate check would not allow to install older files.
  703.     IF ReturnValue% = 2 THEN
  704.         FOR i%=1 TO GetListLength("COMPLEVEL") STEP 1
  705.             Component$ = GetListItem( "COMPLEVEL", i% )
  706.             MakeListFromSectionFilename "COMPFILES", Component$
  707.             FOR j%=1 TO GetListLength("COMPFILES") STEP 1
  708.                 szFile$ = DESTWIN$ + GetListItem( "COMPFILES", j% )
  709.                 IF DoesFileExist(szFile$,femReadWrite) THEN
  710.                     RemoveFile szFile$, cmoVital
  711.                 END IF
  712.             NEXT j%
  713.             RemoveSymbol "COMPFILES"
  714.         NEXT i%
  715.         RemoveSymbol "COMPLEVEL"
  716.  
  717.         ReturnValue% = 1
  718.     END IF
  719.  
  720.     NeedELSADisp = ReturnValue%
  721.  
  722. END FUNCTION
  723.  
  724.  
  725. '**
  726. '** Purpose:
  727. '**     Create or update ELSADISP.INI, this is where we note cross
  728. '**     dependencies and support detection of version conflicts.
  729. '** Arguments:
  730. '**     -
  731. '** Returns:
  732. '**     -
  733. '*************************************************************************
  734. SUB UpdateELSADisp STATIC
  735.  
  736.     IF ACADLT=1 THEN
  737.         DriverName$ = DRIVERNAME_LT
  738.         DriverKey$ = DRIVERKEY_LT
  739.     ELSE
  740.         DriverName$ = DRIVERNAME_12
  741.         DriverKey$ = DRIVERKEY_12
  742.     END IF
  743.  
  744.     '' save version numbers of all components to our INI file ELSADISP.INI
  745.     '' this can be used to check for incompatible updates, see NeedELSADisp()
  746.     ELSAdisp$ = DESTWIN$ + "ELSADISP.INI"
  747.  
  748.     szNewVer$ = GetSectionKeyVersion(DRIVERKEY_12,"VERCHECK")
  749.     CreateIniKeyValue ELSAdisp$, DriverKey$, "Version", szNewVer$, cmoOverwrite
  750.     CreateIniKeyValue ELSAdisp$, DriverKey$, "FullName", DriverName$, cmoOverwrite
  751.  
  752.     uses$ = ""
  753.     FOR i%=1 TO GetListLength("USES") STEP 1
  754.         Component$ = GetListItem( "USES", i% )
  755.         uses$ = uses$ + "," + Component$
  756.         szNewVer$ = GetSectionKeyVersion(Component$,"VERCHECK")
  757.         CreateIniKeyValue ELSAdisp$, Component$, "Version", szNewVer$, cmoOverwrite
  758.         usedby$ = GetIniKeyString( ELSAdisp$, Component$, "UsedBy" )
  759.         IF usedby$ = "" THEN
  760.             usedby$ = DriverKey$
  761.         ELSEIF INSTR( usedby$, DriverKey$ ) = 0 THEN
  762.             usedby$ = usedby$ + "," + DriverKey$
  763.         END IF
  764.         CreateIniKeyValue ELSAdisp$, Component$, "UsedBy", usedby$, cmoOverwrite
  765.     NEXT i%
  766.     CreateIniKeyValue ELSAdisp$, DriverKey$, "Uses", MID$(uses$,2), cmoOverwrite
  767.  
  768. END SUB
  769.  
  770.  
  771. '**
  772. '** Purpose:
  773. '**     Appends a file name to the end of a directory path,
  774. '**     inserting a backslash character as needed.
  775. '** Arguments:
  776. '**     szDir$  - full directory path (with optional ending "\")
  777. '**     szFile$ - filename to append to directory
  778. '** Returns:
  779. '**     Resulting fully qualified path name.
  780. '*************************************************************************
  781. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  782.     IF szDir$ = "" THEN
  783.         MakePath = szFile$
  784.     ELSEIF szFile$ = "" THEN
  785.         MakePath = szDir$
  786.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  787.         MakePath = szDir$ + szFile$
  788.     ELSE
  789.         MakePath = szDir$ + "\" + szFile$
  790.     END IF
  791. END FUNCTION
  792.